# _*_ coding : utf-8 _*_
# @Time : 2023/3/17 0017 17:13
# @Author : 菜鸟王小二
# @File : 29_requests_cookie登录古诗文网
# @Project : python爬虫

import requests
from bs4 import BeautifulSoup

# 难点：
# 1. 两个隐藏域
# 2. 验证码图片获取
# 3. 请求变成一个对象，在一个session中，使用requests.session()方法

url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.63'
}

# 使用requests.session()将请求变成一个对象，多次请求都将会是一个验证码，处于一个会话中，很重要！不然验证码不一样，登录不上
session = requests.session()

response = session.get(url = url,headers = headers)
# print(response.text)

# BeautifulSoup()查找到标签
soup = BeautifulSoup(response.text,'lxml')
# 找到两个隐藏域，此为登录数据
__VIEWSTATE = soup.select('#__VIEWSTATE')[0].attrs.get('value')
__VIEWSTATEGENERATOR = soup.select('input[name = "__VIEWSTATEGENERATOR"]')[0].attrs.get('value')

# 获取验证码的网址,先找到验证码的src，再拼接
imgCode = soup.select('#imgCode')[0].attrs.get('src')
imgBaseSrc = 'https://so.gushiwen.cn'
imgSrc = imgBaseSrc + imgCode
print(imgSrc)

# 登录验证码的网址，获取图片的二进制格式（imgRes.content），再以二进制（wb）的方式写入imgCode.jpg中
# .content就是获取源码的二进制格式
imgRes = session.get(url=imgSrc)
with open('imgCode.jpg','wb') as fp:
    fp.write(imgRes.content)

def gushiwen_login(username,pwd):
    # 通过查看imgCode.jpg的验证码，手动输入验证码
    code = input('请输入验证码： ')
    loginUrl = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'
    data = {
        '__VIEWSTATE': __VIEWSTATE,
        '__VIEWSTATEGENERATOR': __VIEWSTATEGENERATOR,
        'from': 'http://so.gushiwen.cn/user/collect.aspx',
        'email': username,
        'pwd': pwd,
        'code': code,
        'denglu': '登录'
    }

    response = session.request(method='post',url=loginUrl,data=data)
    with open('logined.html','w',encoding='utf-8') as fp:
        fp.write(response.text)

if __name__ == '__main__':
    gushiwen_login('18307698367','wl123456')